﻿/* ********************************************************************************
 * 名称：SysModule_DomainService
 * 描述：系统模块表  领域服务接口实现类（本类通过CodeSmith软件生成生成）
 * 创建人：HFL
 * 创建日期：2020-06-01 17:48:55
 * 修改人：
 * 修改日期：
 * *******************************************************************************/
using WPay.Domain.Base;
using WPay.Domain.Model.DTOs;
using WPay.Domain.Model.Entities;
using WPay.Domain.MainModule.Interface.DomainServices;
using WPay.Domain.MainModule.Interface.RepositoryServices;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using Models.DTO.Api.page.Form;
using WPay.Infrastructure.EFCore;
using WPay.Infrastructure.Unity;
using System.Linq;

namespace WPay.Domain.MainModule
{
    /// <summary>
    /// 系统模块表 领域服务接口实现类
    /// </summary>
    public class SysModule_DomainService : ISysModule_DomainService
    {

        /// <summary>
        /// 系统模块表 领域服务接口
        /// </summary>
        private ISysModule_RepositoryService sysModule_RepositoryService;
        private readonly IEfCore_RepositoryService _efCore_RepositoryService;
        private Entities db;
        /// <summary>
        /// 带参构造，用于IOC
        /// </summary>
        public SysModule_DomainService(ISysModule_RepositoryService _sysModule_RepositoryService,
            IEfCore_RepositoryService efCore_RepositoryService)
        {
            sysModule_RepositoryService = _sysModule_RepositoryService;
            _efCore_RepositoryService = efCore_RepositoryService;
            db = _efCore_RepositoryService.DbContext();
        }


        #region 由软件生成，禁止修改，若需要扩展，请在下方进行扩展

        /// <summary>
        /// 根据主键获取系统模块表资料信息
        /// </summary>
        /// <param name="_iD"></param>
        /// <returns>返回单个系统模块表数据实体</returns>
        public SysModule Get(string _iD)
        {
            return this.sysModule_RepositoryService.Get(_iD);
        }

        /// <summary>
        /// 获取所有记录
        /// </summary>
        /// <param name="_cpnID">企业代码</param>
        /// <returns>返回系统模块表数据集合</returns>
        public List<SysModule> GetAll(string _cpnID)
        {
            return this.sysModule_RepositoryService.GetAll(_cpnID);
        }

        /// <summary>
        /// 获取所有记录
        /// </summary>
        /// <param name="_param">查询条件字典，其中key必须使用字段名</param>
        /// <returns>返回系统模块表数据集合</returns>
        public List<SysModule> GetAll(Hashtable _param)
        {
            return this.sysModule_RepositoryService.GetAll(_param);
        }

        /// <summary>
        /// 按照分页条件查询数据集
        /// </summary>
        /// <param name="_param">查询条件字典，其中key必须使用字段名</param>
        /// <param name="_pageIndex">查询页码，从1开始，必传</param>
        /// <param name="_pageSize">每页查询数据条数，必传</param>
        /// <param name="_sort">排序列名，若要降序请用列名+" DESC"，必传</param>
        /// <param name="_pageCount">返回总页码数</param>
        /// <param name="_dataCount">返回总数据条数</param>
        /// <returns>返回系统模块表数据集合</returns>
        public List<SysModule> GetByPage(Hashtable _param, int _pageIndex, int _pageSize, string _sort, out int _pageCount, out int _dataCount)
        {
            return this.sysModule_RepositoryService.GetByPage(_param, _pageIndex, _pageSize, _sort, out _pageCount, out _dataCount);
        }

        /// <summary>
        /// 插入系统模块表数据
        /// </summary>
        /// <param name="_sysModule">需要插入的系统模块表数据实体</param>
        /// <returns>返回影响数据行数</returns>
        public int Add(SysModule _sysModule)
        {
            return this.sysModule_RepositoryService.Add(_sysModule);
        }

        /// <summary>
        /// 批量插入系统模块表数据
        /// </summary>
        /// <param name="_sysModuleList">需要插入的系统模块表数据集合</param>
        /// <returns>返回影响数据行数</returns>
        public int Add(List<SysModule> _sysModuleList)
        {
            return this.sysModule_RepositoryService.Add(_sysModuleList);
        }

        /// <summary>
        /// 根据主键更新系统模块表数据
        /// </summary>
        /// <param name="_sysModule">需要更新的系统模块表数据实体</param>
        /// <returns>返回影响数据行数</returns>
        public int Update(SysModule _sysModule)
        {
            return this.sysModule_RepositoryService.Update(_sysModule);
        }

        /// <summary>
        /// 根据主键更新系统模块表指定字段
        /// </summary>
        /// <param name="_sysModule">需要更新的系统模块表数据实体</param>
        /// <param name="_updateProNames">需要更新的字段名</param>
        /// <returns>返回影响数据行数</returns>
        public int Update(SysModule _sysModule, params string[] _updateProNames)
        {
            return this.sysModule_RepositoryService.Update(_sysModule, _updateProNames);
        }


        #endregion

        /*业务扩展代码*/
        #region 业务扩展代码
        /// <summary>
        /// 添加模块
        /// </summary>
        /// <param name="dto"></param>
        public void AddSysModule(SysModuleFormDTO dto)
        {
            if (_efCore_RepositoryService.Exists(new DirectSpecification<SysModule>(x => !x.IsDeleted && x.ID != dto.ID && x.ModuleName == dto.ModuleName)))
            {
                throw new UNException("当前模块名称已存在,请重新填写");
            }
            if (string.IsNullOrEmpty(dto.ID))
            {
                dto.ID = Guid.NewGuid().ToString();
                var db = ClassHelper.TransExpV2<SysModuleFormDTO, SysModule>.Trans(dto);
                Add(db);
            }
            else
            {
                var db = _efCore_RepositoryService.GetByKey<SysModule>(dto.ID);
                if (db == null)
                {
                    throw new UNException("未找到当前对象,请刷新页面后尝试");
                }
                db.ModuleCls = dto.ModuleCls;
                db.ModuleName = dto.ModuleName;
                db.PID = dto.PID;
                db.OrderID = dto.OrderID;
                _efCore_RepositoryService.Update<SysModule>(db, x => x.ModuleCls, x => x.ModuleName, x => x.PID, x => x.OrderID);
                _efCore_RepositoryService.SaveChanges();
            }
        }
        /// <summary>
        /// 删除模块
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public bool DeleteSysModule(string id)
        {
            if (id == null || !_efCore_RepositoryService.Exists(new DirectSpecification<SysModule>(x => !x.IsDeleted && x.ID == id)))
            {
                throw new UNException("未找到当前数据,请刷新页面后尝试");
            }
            var obj = _efCore_RepositoryService.GetByKey<SysModule>(id);
            _efCore_RepositoryService.Remove<SysModule>(obj);
            return _efCore_RepositoryService.SaveChanges();
        }
        /// <summary>
        /// 添加菜单
        /// </summary>
        /// <param name="dto"></param>
        public void AddSysModuleAction(SysModuleActionFormDTO dto)
        {
            if (string.IsNullOrEmpty(dto.ModuleID))
            {
                throw new UNException("所属模块不可选顶级!");
            }
            if (string.IsNullOrEmpty(dto.ActionName))
            {
                throw new UNException("功能名称必须填写!");
            }
            if (_efCore_RepositoryService.Exists(new DirectSpecification<SysModuleAction>(x => !x.IsDeleted && x.ModuleID == dto.ModuleID && x.ActionName == dto.ActionName && x.ID != dto.ID)))
            {
                throw new UNException("当前已有同名功能,请确保功能名称唯一!");
            }

            if (string.IsNullOrEmpty(dto.ID))
            {
                var orderid = _efCore_RepositoryService.GetMany(new DirectSpecification<SysModuleAction>(x => !x.IsDeleted && x.ModuleID == dto.ModuleID));
                dto.OrderID = (orderid == null || orderid.Count() <= 0) ? 0 : orderid.Max(x => x.OrderID) + 1;
                dto.Weight = Convert.ToInt32(Math.Pow(2, (dto.OrderID)));
                dto.ID = Guid.NewGuid().ToString();
                dto.ShowEnum = true;
                var obj = ClassHelper.TransExpV2<SysModuleActionFormDTO, SysModuleAction>.Trans(dto);
                _efCore_RepositoryService.Add(obj);
            }
            else
            {
                var db = _efCore_RepositoryService.GetByKey<SysModuleAction>(dto.ID);
                if (db == null)
                {
                    throw new UNException("未找到当前对象,请刷新页面后尝试");
                }
                db.ModuleID = dto.ModuleID;
                db.ActionName = dto.ActionName;
                db.ActionFun = dto.ActionFun;
                db.ActionCls = dto.ActionCls;
                db.ActionUrl = dto.ActionUrl;
                _efCore_RepositoryService.Update<SysModuleAction>(db, x => new { x.ModuleID, x.ActionName, x.ActionFun, x.ActionCls, x.ActionUrl });
            }
            _efCore_RepositoryService.SaveChanges();
        }
        /// <summary>
        /// 删除模块
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        public bool DeleteSysModuleAction(string ids)
        {
            if (!string.IsNullOrEmpty(ids))
            {
                var delId = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(ids).Select(x => x).ToList();
                _efCore_RepositoryService.LogicDelete(new DirectSpecification<SysModuleAction>(x => delId.Contains(x.ID)));
                return _efCore_RepositoryService.SaveChanges();
            }
            return true;
        }
        #endregion
    }
}
